package org.mbcorp.sar.model;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;
import javax.persistence.Transient;

import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
import org.springframework.format.annotation.DateTimeFormat;

@Entity
@Table
@PrimaryKeyJoinColumn(name = "id", referencedColumnName = "id")
public class Operador extends Usuario implements Serializable{

	private static final long serialVersionUID = 1L;
	
	@Transient
	private final float FACTOR_HORARIO_PREVISION = 0.20f;

	@Column(nullable = false)
	private String nombre;
	
	@Column(nullable = false)
	private String email;
	
	@Column(nullable = false)
	private Integer puntajeAcumulado;
	
//	@ManyToMany
//	@LazyCollection(LazyCollectionOption.FALSE)
//	@JoinTable(name="Experticia", joinColumns = {@JoinColumn(name="idOperador")},
//		       inverseJoinColumns={@JoinColumn(name="idNivelCompetencia")})
//	private List<NivelCompetencia> nivelesDeCompetencia;	
	
	@OneToMany(mappedBy = "operador")
	@LazyCollection(LazyCollectionOption.FALSE)
	private List<Experticia> experticias;
	
	@OneToMany(mappedBy = "operador")
	@LazyCollection(LazyCollectionOption.FALSE)
	private List<Logro> logros;
	
	@Column(nullable = false)
	private int jornadaInicio;
	
	@Column(nullable = false)
	private int jornadaFin;
	
	@OneToMany(mappedBy = "operador")
	@LazyCollection(LazyCollectionOption.FALSE)
	@OrderBy("fechaInicio ASC")
	private List<Horario> horarios;
	
	@Transient
	@DateTimeFormat(pattern = "dd-MM-yyyy HH:mm:ss")
	private Date fechaDisponibilidad;
	
	
//	@Transient
//	private List<Medalla> listaMedallasObtenidas;
	
	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public Integer getPuntajeAcumulado() {
		return puntajeAcumulado;
	}

	public void setPuntajeAcumulado(Integer puntajeAcumulado) {
		this.puntajeAcumulado = puntajeAcumulado;
	}

//	public List<NivelCompetencia> getNivelesDeCompetencia() {
//		return nivelesDeCompetencia;
//	}
//
//	public void setNivelesDeCompetencia(List<NivelCompetencia> nivelesDeCompetencia) {
//		this.nivelesDeCompetencia = nivelesDeCompetencia;
//	}	
	
	public int getJornadaInicio() {
		return jornadaInicio;
	}

	public List<Experticia> getExperticias() {
		return experticias;
	}

	public void setExperticias(List<Experticia> experticias) {
		this.experticias = experticias;
	}

	public void setJornadaInicio(int jornadaInicio) {
		this.jornadaInicio = jornadaInicio;
	}

	public int getJornadaFin() {
		return jornadaFin;
	}

	public void setJornadaFin(int jornadaFin) {
		this.jornadaFin = jornadaFin;
	}

	public List<Horario> getHorarios() {
		return horarios;
	}

	public void setHorarios(List<Horario> horarios) {
		this.horarios = horarios;
	}

	public Date getFechaDisponibilidad() {
		return fechaDisponibilidad;
	}

	public void setFechaDisponibilidad(Date fechaDisponibilidad) {
		this.fechaDisponibilidad = fechaDisponibilidad;
	}		
		
	public List<Logro> getLogros() {
		return logros;
	}

	public void setLogros(List<Logro> logros) {
		this.logros = logros;
	}

	public int getJornadaFinProvisional(){
		int horasJornada = this.getJornadaFin() - this.getJornadaInicio();
		int jornadaReducida = (int) Math.ceil(horasJornada*(FACTOR_HORARIO_PREVISION));
		return this.getJornadaFin() - jornadaReducida;
	}
	
	@Transient
	public int getNumeroMedallasOro(){
		int numero = 0;
		for(Logro logro : this.getLogros()){
			if(logro.getFechaObtencion() != null && logro.getMedalla().getCategoria().equals("oro")){
				numero++;
			}			
		}
		return numero;
	}
	
	@Transient
	public int getNumeroMedallasPlata(){
		int numero = 0;
		for(Logro logro : this.getLogros()){
			if(logro.getFechaObtencion() != null && logro.getMedalla().getCategoria().equals("plata")){
				numero++;
			}			
		}
		return numero;
	}
	
	@Transient
	public int getNumeroMedallasBronce(){
		int numero = 0;
		for(Logro logro : this.getLogros()){
			if(logro.getFechaObtencion() != null && logro.getMedalla().getCategoria().equals("bronce")){
				numero++;
			}			
		}
		return numero;
	}

//	public List<Medalla> getListaMedallasObtenidas() {
//		return listaMedallasObtenidas;
//	}
//
//	public void setListaMedallasObtenidas(List<Medalla> listaMedallasObtenidas) {
//		this.listaMedallasObtenidas = listaMedallasObtenidas;
//	}
	
	
	
}
